package com.tuozixuan;

import java.io.File;
import java.io.IOException;

import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.ResetCommand.ResetType;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
import static com.tuozixuan.GitDemoConstants.*;

public class GitResetDemo {

	public static void main(String[] args) throws IOException {
		new GitResetDemo().rollBackPreRevision(LOCAL_DIR, "9bd830058293df9f8f871cfe45a2bb2b6141d6dc");
	}

	/**
     * 将git仓库内容回滚到指定版本，回退前要考虑版本所处分支和当前仓库分支是否一致，否则回退失败
     *
     * @param gitRoot 仓库目录
     * @param commitId 指定的版本号
     * @return true, 回滚成功, 否则flase
     * @throws IOException
     */
    public boolean rollBackPreRevision(String gitRoot, String commitId) throws IOException {
        // Git实现了AutoCloseable，默认会关闭repository
        try (Git git = Git.open(new File(gitRoot))){
            git.reset().setMode(ResetType.HARD).setRef(commitId).call();
        } catch (GitAPIException e) {
        	e.printStackTrace();
            //log.error("回退失败",e);
        }
        return true;
    }

    /**
     * 将git仓库内容回滚到指定版本的上一个版本，回退前要考虑版本所处分支和当前仓库分支是否一致，否则回退失败
     *
     * @param gitRoot 仓库目录
     * @param commitId 指定的版本号
     * @return true, 回滚成功, 否则flase
     * @throws IOException
     */
    public boolean rollBackPreRevision2(String gitRoot, String commitId) throws IOException {
        // Git实现了AutoCloseable，默认会关闭repository
        try (Git git = Git.open(new File(gitRoot))){
            Repository repository = git.getRepository();
            // 获取 commitId 的上一个版本
            RevWalk walk = new RevWalk(repository);
            ObjectId objId = repository.resolve(commitId);
            RevCommit revCommit = walk.parseCommit(objId);
            String preVision = revCommit.getParent(0).getName();
        
            git.reset().setMode(ResetType.HARD).setRef(preVision).call();
            walk.close();
        } catch (GitAPIException e) {
        	e.printStackTrace();
            // log.error("回退失败",e);
        }
        return true;
    }

}
